SQLScript Grundlagen

Lexikalische Elemente der Sprache SQLScript

(C) Brandeis Consulting.

Lexikalische Elemente der Sprache SQLScript

Anweisungen
Whitespace
Kommentare
Literale
Bezeichner
Lokale Variablen und Parameter
Operatoren
Ausdrücke

Und noch zwei erklärungsbedürftige Konzepte:
NULL
DUMMY

(C) Brandeis Consulting.

Anweisungen

Die Sprache SQLScript besteht aus Anweisungen. Eine Anweisung beginnt, außer bei Zuweisungen, mit einem Schlüsselwort und endet mit einem Semikolon.
Arten von Anweisungen
SQL-Anweisungen wie zum Beispiel INSERT, CREATE PROCEDURE oder COMMIT
Zuweisungen durch Gleichheitszeichen oder mit der INTO-Klausel einer SELECT-Abfrage
Schleifen mit FOR oder WHILE oder als Cursor
Bedingte Verzweigungen mit IF
Prozeduraufrufe
Deklaration von Variablen mit DECLARE

(C) Brandeis Consulting.

Verschachtelte Anweisungen

Manche Anweisungen könne selber wieder Anweisungen enthalten. So bildet beispielsweise eine IF-Anweisung eine Klammer um einen oder mehrere Anweisungsblöcke (Dazu später mehr).

In dem Listing beginnt die IF-Anweisung in Zeile 1 und endet mit dem Semikolon in Zeile 4. Die INSERT-Anweisung beginnt und endet in Zeile 3.

(C) Brandeis Consulting.

Whitespace

In SQLScript ist Whitespace nur dort erforderlich, wo eine eindeutige Trennung aufeinanderfolgender Schüsselwörter, Felder, Variablen usw. sonst nicht möglich wäre. Er darf aber auch überall sonst zwischen den einzelnen Sprachelementen eingefügt werden.

Whitespace ist in erster Linie für eine bessere Lesbarkeit hilfreich

(C) Brandeis Consulting.

Kommentare

Kommentare sind Bestandteile des Quelltextes, die von System vollständig ignoriert werden. Der Inhalt eines Kommentars dient also nur dem menschlichen Leser zum Verständnis des Codes. SQLScript unterscheidet zwei Varianten von Kommentaren: Zeilenendkommentare und Blockkommentare.

(C) Brandeis Consulting.

Blockkommentare

Blockkommentare beginnen mit den beiden Zeichen Schrägstrich und Stern und Enden mit Stern und Schrägstrich:

Blockkommentare können über mehrere Zeilen gehen. Sie können auch mittten in einer Zeile beginnen.

(C) Brandeis Consulting.

Zeilenendkommentare

Ein Zeilenendkommentar beginnt mit einem doppelten Bindestrich. Alles was danach bis zum Ende der Zeile geschrieben steht, wird nicht als Anweisung interpretiert. Vor dem Zeilenendkommentar können Teile von Anweisungen stehen.

ABAP Kommentare

In AMDP Prozeduren und Funktionen können auch die ABAP Zeilenkommentare verwendet werden. Diese beginnen mit einem * an der ersten Stelle einer Zeile.

Bitte vermeidet diese ABAP Kommentare, da der AMDP Code sonst nicht mehr in die SQL-Konsole kopiert werden kann! Blockkommentare mit /* */ sind genau so praktisch.

ABAP Zeilenendkommentare mit Gänsefüßchen " können nicht verwendet werden. Dieses Zeichen leitet immer den Anfang eines Bezeichners in spezieller Notation ein.

(C) Brandeis Consulting.

Literale

Literale repräsentieren konstante Werte im Quellcode, der direkt eingegeben wird. Dieser kann an unterschiedlichen Stellen verwendet werden, wie zum Beispiel in Zuweisungen, als Feldwert oder als Vergleichswert in einer Bedingung.

(C) Brandeis Consulting.

Datentypen von Literalen

Warum sind die Datentypen von Literalen wichtig?
Weil die Werte sonst immer wieder in passenden Typ konvertiert werden müssen. Das geschieht meist implizit, kostet aber Laufzeit. Wo eine implizite Konvertierung nicht möglich ist, kommt es zu Fehlern.

In BW-Transformationen werden Felder z.B. gerne mit '' geleert. Dadurch wird aber der Typ dieser Spalte als Zeichenkette festgelegt. Das führt bei Kennzahlen zu Fehlermeldungen.

(C) Brandeis Consulting.

Bezeichner

Bezeichner sind Namen für Objekte in der HANA wie zum Beispiel für Tabellen, Views und Spalten. Diese Bezeichner sind grundsätzlich Case sensitiv. Dabei ist es wichtig, wie der Quelltext vom System interpretiert wird. Dabei gibt es zwei unterschiedliche Notationen:

  • Spezielle Notation
  • Einfache Notation

Beide Notationen können auch innerhalb einer Anweisung beliebig gemischt werden.

(C) Brandeis Consulting.

Spezielle Notation

In der speziellen Notation werden die Bezeichner in Gänsefüßchen eingerahmt. Dabei sind alle Unicodezeichen an jeder Position erlaubt. Das bedeutet, dass auch Leerzeichen, Sonderzeichen wie zum Beispiel Punkt und Komma als auch alle anderen Zeichen erlaubt sind.

(C) Brandeis Consulting.

Einfache Notation

In der einfachen Notation werden die Bezeichner im Quelltext nicht in Gänsefüßchen angegeben. Damit wird er intern automatisch in Großbuchstaben konvertiert. Außerdem gelten dann für Ihn die folgenden Einschränkungen:
Er muss mit einem Buchstaben oder einem Unterstrich beginnen
Er darf nur aus den folgenden Zeichen bestehen:
Buchstaben des lateinischen Alphabets, keine Umlaute
Ziffern
Unterstrich _
Dollar-Zeichen $
Doppelkreuz #

(C) Brandeis Consulting.

Bezeichner im BW

Für alle Feld- und Tabellenamen mit den Namensraum-Präfixen /BIC/ und /BI0/ ist die spezielle Notation notwendig.
Für alle selber vergebenen Namen, insbesondere innerhalb des Quelltextes, sollte nach Möglichkeit nur die einfache Notation verwendet werden.

(C) Brandeis Consulting.

Lokale Variablen

In SQLScript kann man auf lokale Tabellenvariablen und Tabellenparameter genauso mit einer SELECT-Anweisung zugreifen wie auf Datenbanktabellen. Somit ist bei lesendem Zugriff eine Unterscheidung notwendig, damit der Quellcode eindeutig bleibt. Hierfür wird ein Doppelpunkt vor die entsprechende Variable gesetzt.

Bei schreibendem Zugriff ist der Doppelpunkt nicht erforderlich, da hier keine Verwechslungsgefahr mit den Datenbankobjekten besteht.

(C) Brandeis Consulting.

Systemvariable

In SQLScript gibt es einige Systemvariablen, die in Ihrem Kontext jeweils nützliche Informationen liefern können. Die Systemvariablen beginnen mit zwei führenden Doppelpunkten.
::CURRENT_OBJECT_NAME - Name der Prozedur oder Funktion, in der die Systemvariable abgefragt wird. In anonymen Blöcken hat die Variable den Wert NULL. Außerhalb von logischen Containern liefert der Zugriff auf die Variable einen Fehler.
::CURRENT_OBJECT_SCHEMA - Das Datenbankschema der Prozedur oder Funktion, in der die Systemvariable abgefragt wird. Die Sichtbarkeit ist analog der Variable ::CURRENT_OBJECT_NAME
::SQL_ERROR_CODE - Enthält den aktuellen Fehlercode. Diese Variable ist nur innerhalb von Fehlerbehandlern sichtbar.
::SQL_ERROR_MESSAGE - Enthält die Nachricht zum aktuellen Fehlercode. Die Sichtbarkeit ist analog zu der Variable ::SQL_ERROR_CODE.
::ROWCOUNT - Die Variable enthält die Anzahl der durch die letzte ändernden Datenbankanweisung veränderten Datensätze. Lesende Datenbankanweisungen sind nicht relevant. Falls Sie die Variable abfragen, bevor eine ändernde Datenbankanweisung stattgefunden hat, wird ein Fehler erzeugt.

(C) Brandeis Consulting.

Operatoren

Operatoren berechnen ein Ergebnis aus den Operanden. Beispielsweise kann man zwei Zahlen mit dem Plus (+) Operator zu Ihrer Summe verknüpfen:

(C) Brandeis Consulting.

Arten von Operatoren

Arithmetische Operatoren

liefern ein numerisches Ergebnis.
Addition: +
Subtraktion: -
Multiplikation: *
Division : /
Negation: - als Vorzeichen

Zeichenkettenoperatoren

Verketten von Zeichenketten zu einer neuen Zeichenkette: ||

Vergleichsoperatoren

Vergleichsoperatoren liefern als Ergebnis eine Aussage in boolescher Logik, die entweder TRUE, FALSE oder UNKNOWN sein kann. UNKNOWN entspricht einem NULL-Wert der Datenbank. Das Ergebnis der Operatoren ist immer genau dann UNKNOWN, wenn ein Operand NULL ist.
Gleich =
Ungleich != oder <>
Kleiner als <
Größer als >
Kleiner gleich <=
Größer gleich >=

Logische Operatoren

Logische Operatoren verknüpfen logische Aussagen zu neuen logischen Aussagen.
AND– Wenn beide Operanden TRUE ergeben, ist das Ergebnis auch TRUE
OR – Wenn mindestens einer der beiden Operanden TRUE ist, ist das Ergebnis TRUE
NOT – Dieser unäre Operator negiert den Wert seines Operanden. Aus TRUE wird FALSE und umgekehrt.

(C) Brandeis Consulting.

Auswertungsreihenfolge der Operatoren

Auswertungsreihenfolge der Operatoren von oben nach unten:
Ausdrücke…
…sind ist ein Sprachkonstrukt, das in seinem Kontext ausgewertet wird und dabei einen Wert (Einzelwert oder Tabelle) zurückgibt.
…können an unterschiedlichen Stellen einer SQL-Anweisung verwendet werden
…können Ausdrücke enthalten
…können als Ergebnis einen skalaren Wert oder eine Tabelle haben

(C) Brandeis Consulting.

Skalare Werte vs. Tabellen

Skalare Werte speichern genau einen Wert, z.B. eine Zahl oder ein Datum.

Tabellen enthalten Zeilen und Spalten. Auch das Ergebnis einer SELECT-Abfrage, die genau eine Zeile und eine Spalte liefert, ist eine Tabelle. Diese Abfragen werden skalare Abfragen genannt.
Welche skalaren Ausdrücke gibt es?
Literale
Variablennamen
Spaltennamen
Funktionsaufrufe
SQL-Funktionen
Aggregatfunktionen
User Defined Functions (UDF)
Operatorausdrücke - Verknüpfung von Ausdrücken mit Operatoren
CASE-Ausdruck
(Korrelierte-) Unterabfragen
Ein Beispiel für unterschiedliche Ausdrücke
SELECT
-- Feldname als Ausdruck
id,
-- Verkettungsoperation als Ausdruck
firstname || ' ' || lastname AS name,
-- CASE-Ausdruck..
CASE sex
-- ..mit Funktionsaufruf als Ausdruck
WHEN 'F' THEN NCHAR(9792)
WHEN 'M' THEN NCHAR(9794)
ELSE ''
END
AS MW,
-- Funktionsaufruf als Ausdruck
COALESCE(team, 0) as team
FROM users;

Übungsaufgabe
Wo kann man Ausdrücke verwenden?
An allen Stellen wo ein Wert benötigt wird, kann man Ausdrücke verwenden.

Beispiel

Tabellenausdrücke
Tabellenausdrücke können dort verwendet weden, wo ein Tabellenname erwartet wird. Also z.B. in der FROM-Klausel:

Als Tabellenausdruck stehen zur Verfügung:
Namen von Datenbanktabellen oder -views
Tabellen-Funktionen
Lokale Tabellenvariablen
Unterabfragen

Prädikate
Ein Prädikat ist ein Ausdruck, der zu TRUE, FALSE oder UNKNOWN aufgelöst wird. Beispielsweise:
Vergleich (<, =, >, ….)
LIKE
BETWEEN
IS (NOT) NULL
EXISTS
IN

NULL
Bei NULL handelt es sich nicht um einen konkreten Wert, sondern um das Fehlen eines Wertes. Insbesondere handelt es sich nicht um einen gültigen Initialwert wie zum Beispiel 0 oder SPACE.

NULL wird in der Datenvorschau entweder als NULL oder als Fragezeichen dargestellt.

Ein Beispiel für NULL
Übungsaufgabe
Finde alle Zeilen, wo der Name nicht mit P anfängt
Ein Beispiel für NULL
NULL im BW
In Transformationsroutinen darf in der Ausgabetabelle der Wert eines Merkmals nicht NULL sein!
Rechnen mit NULL
NULL ist nicht definiert. Also ist auch das Ergebnis einer Berechnung mit NULL auch nicht definiert.
Ein NULL-Wert kann komplexe Ausdrücke infizieren, so dass das Endergebnis auch NULL ist.

Einfache Beispiele:
NULL + 5 = NULL
NULL || 'ABC' = NULL

NULL in Prädikaten
Über NULL lässt sich keine logische Aussage treffen. Die Bedingung
WHERE col1 = NULL;
ist niemals erfüllt.
NULL abfangen
Mit Funktionen NULL-Werte ersezten:

Datensätze mit IS NOT NULL ausfiltern:
Die Tabelle DUMMY
In jedem SAP HANA System existiert eine Tabelle mit Namen DUMMY. Diese hat eine Spalte mit dem Namen DUMMY und enthält genau eine Zeile mit dem Wert X. Der Inhalt von DUMMY kann nicht geändert werden.

Die Tabelle DUMMY ist sehr hilfreich beim Test von Ausdrücken oder zum Erzeugen von leeren Tabellen mit einer festen Struktur.
Beispiele für die Verwendung von DUMMY
Test eines Ausdrucks:

Erstellen einer leeren Tabelle mit zwei Spalten:
Weiteres Beispiel…
Fragen?

(C) Brandeis Consulting.

Tabelle

USERID FIRSTNAME LASTNAME BIRTHDATE SEX ...
1 Peter Müller 20010101 M
2 Siegfried Mustermann 19790203 M
3 Petra Maier 19820304 F
(C) Brandeis Consulting.

Links

(C) Brandeis Consulting.

Clean Code Empfehlungen

  • Methodennamen sollten nicht 1:1 Funktionsnamen entsprechen. Eine Methode mit dem Namen replace führt zu Verwirrung.
  • Funktionen sind für die Zeichenettenverarbeitung meist besser als Anweisungen, weil keine Hilfsvariablen benötigt werden.
(C) Brandeis Consulting.

2-Spaltiges Template


(C) Brandeis Consulting.